package com.naiterui.ehp.ps.sms.utils;

import java.util.List;
import java.util.Set;

import org.springframework.data.redis.core.StringRedisTemplate;

import com.naiterui.common.redis.RedisUtil;
import com.naiterui.ehp.bp.utils.context.SpringContextHolder;

/**
 * Redis工具类封装
 * <p>
 * File name : RedisUtils.java
 * </P>
 * <p>
 * Author : zhouyanxin
 * </P>
 * <p>
 * Date : 2015年7月2日
 * </P>
 */
public final class RedisUtils {
    private static StringRedisTemplate stringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate", StringRedisTemplate.class);

    // 添加数据至缓存
    public static void set(final String key, final Object value, final int timeout) {
        RedisUtil.valueOps().set(key, value, timeout);
    }

    // 添加数据至缓存(添加字符串类型缓存)
    public static void set(final String key, final String value) {
        RedisUtil.valueOps().set(key, value);
    }

    // 添加数据至缓存
    public static void set(final String key, final Object value) {
        RedisUtil.valueOps().set(key, value);
    }

    public static List<String> hmget(String key, String... fields) {
        return RedisUtil.hashOps().hmget(key, fields);
    }

    // 从缓存中获取数据
    public static Object get(final String key) {
        return RedisUtil.valueOps().getObject(key);
    }

    public static String getString(final String key) {
        return RedisUtil.valueOps().getString(key);
    }

    // 从缓存中删除指定数据
    public static void delete(final String key) {
        RedisUtil.keyOps().delete(key);
    }

    // 自增方法
    public static long incre(final String key) {
        return RedisUtil.keyOps().incr(key);
    }

    // 获取map中的entry
    public static String hget(String key, String field) {
        return RedisUtil.hashOps().hget(key, field);
    }

    /**
     * 增加指定的值
     * RedisUtils.incrBy()
     *
     * @param key
     * @param by
     *
     * @return
     *
     * @Author
     * @Date 2017年12月5日
     * @since 1.0.0
     */
    public static Long incrBy(String key, Integer by) {
        Long ret = RedisUtil.keyOps().incrBy(key, by);
        return ret;
    }

    /**
     * 减去指定的值
     * RedisUtils.decrBy()
     *
     * @param key
     * @param by
     *
     * @return
     *
     * @Author
     * @Date 2017年12月5日
     * @since 1.0.0
     */
    public static Long decrBy(String key, Integer by) {
        Long ret = RedisUtil.keyOps().decrBy(key, by);
        return ret;
    }

    // 判断缓存中是否存在指定的KEY
    public static boolean existsKey(final String key) {
        return RedisUtil.keyOps().existsKey(key);
    }

    /**
     * 添加redis值
     * RedisUtils.setnx()
     *
     * @param key
     * @param value
     *
     * @return 如果key存在则设置失败返回0，否则设置成功返回1
     *
     * @Author
     * @Date 2017年8月11日
     * @since 1.0.0
     */
    public static Long setnx(String key, String value) {
        return stringRedisTemplate.opsForValue().setIfAbsent(key, value) ? 1L : 0L;
    }

    /**
     * 设置指定key的过期时间
     * RedisUtils.expire()
     *
     * @param key
     * @param seconds
     *
     * @return
     *
     * @Author
     * @Date 2017年8月11日
     * @since 1.0.0
     */
    public static Long expire(String key, int seconds) {
        return RedisUtil.keyOps().expire(key, seconds);
    }

    /**
     * 发布订阅消息
     * RedisUtils.publish()
     *
     * @param channel
     * @param message
     *
     * @return
     *
     * @Author
     * @Date 2017年8月14日
     * @since 1.0.0
     */
    public static void publish(String channel, String message) {
        stringRedisTemplate.convertAndSend(channel, message);
    }

    // sismember
    public static boolean sismember(String key, String member) {
        return RedisUtil.setOps().sismember(key, member);
    }

    // smember
    public static Set<String> smember(String key) {
        return RedisUtil.setOps().smembers(key);
    }

    // sadd
    public static void sadd(String key, String... members) {
        RedisUtil.setOps().sadd(key, members);
    }

    // srem
    public static void srem(String key, String... members) {
        RedisUtil.setOps().srem(key, members);
    }

}
